/*global process __dirname */
const pkg = require('./package.json');
import dayjs from 'dayjs';
import type { UserConfig, ConfigEnv } from 'vite';
import { loadEnv } from 'vite';

// 如果编辑器提示 path 模块找不到，则可以安装一下 @types/node -> npm i @types/node -D
import * as path from 'path';

const root: string = process.cwd();

import { createProxy } from './build/vite/proxy';
import { wrapperEnv } from './build/utils';

// import { configManualChunk } from './build/vite/optimizer';
// 快速生成插件
import { createVitePlugins } from './build/vite/plugin';

import { OUTPUT_DIR } from './build/constant';

/**
 * 解析路径
 * @param dir {String} 文件路径
 */
const resolve = (dir: string) => path.resolve(__dirname, '.', dir);

const { dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
  pkg: { dependencies, devDependencies, name, version },
  lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
};
// https://vitejs.dev/config/
export default ({ command, mode }: ConfigEnv): UserConfig => {
  const env = loadEnv(mode, root);
  const viteEnv = wrapperEnv(env);
  const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv;

  const isBuild = command === 'build';

  return {
    base: VITE_PUBLIC_PATH, // 设置打包路径
    // 插件
    root,
    resolve: {
      alias: [
        // {
        //   find: 'vue-i18n',
        //   replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
        // },
        // {
        //   '@': resolve('src'), // 设置 `@` 指向 `src` 目录
        //   '@config': resolve('src/config'), // 设置 `@config` 指向 `config` 目录
        // },
        // /@/xxxx => src/xxxx
        {
          find: '@config',
          replacement: resolve('src/config'),
        },
        {
          find: /\/?@\//,
          replacement: `/${resolve('src')}/`,
        },
        // /#/xxxx => types/xxxx
        {
          find: /\/?#\//,
          replacement: `/${resolve('types')}/`,
        },
      ],
    },
    server: {
      // 侦听所有本地 IP
      host: true,
      // 设为 true 时若端口已被占用则会直接退出，而不是尝试下一个可用端口。
      strictPort: Boolean(VITE_PORT),
      port: VITE_PORT, // 设置服务启动端口号
      open: false, // 设置服务启动时是否自动打开浏览器
      // 为开发服务器配置 CORS。默认启用并允许任何源，传递一个 选项对象 来调整行为或设为 false 表示禁用。
      cors: true,

      // 从 .env 加载代理配置
      proxy: createProxy(VITE_PROXY),
      // 设置代理，根据我们项目实际情况配置
      // proxy: {
      //   '/api': {
      //     target: 'http://xxx.xxx.xxx.xxx:8000',
      //     changeOrigin: true,
      //     secure: false,
      //     rewrite: (path) => path.replace('/api/', '/')
      //   }
      // }
    },
    build: {
      minify: 'esbuild',
      target: 'es2015',
      outDir: OUTPUT_DIR,
      // 传递给 Terser 的更多 minify 选项。
      // https://terser.org/docs/api-reference#minify-options
      terserOptions: {
        compress: {
          // 防止被压缩到通道，这可能会导致Chrome上的性能问题。false true Infinity 1/0
          keep_infinity: true,
          // 传递到丢弃功能的呼叫。如果您希望在放弃函数呼叫后放弃特定函数呼叫（如和/或保留函数参数的副作用），
          // 请改为使用。false true console.* console.info pure_funcs
          drop_console: VITE_DROP_CONSOLE,
          drop_debugger: true,
        },
      },
      rollupOptions: {
        output: {
          // 利用rollup 分离css与js
          manualChunks: {
            lodash: ['lodash'],
            'element-plus': ['element-plus'],
          },
          // manualChunks: configManualChunk,
        },
      },
      // 启用/禁用 brotli 压缩大小报告。压缩大型输出文件可能会很慢，因此禁用该功能可能会提高大型项目的构建性能。
      brotliSize: true,
      // 块大小警告限制
      chunkSizeWarningLimit: 2000,
    },
    define: {
      __APP_INFO__: JSON.stringify(__APP_INFO__),
      __APP_VERSION__: JSON.stringify(pkg.version),
      // 设置vue-i18-next
      __VUE_I18N_LEGACY_API__: false,
      __VUE_I18N_FULL_INSTALL__: false,
      // 禁止警告
      __INTLIFY_PROD_DEVTOOLS__: false,
    },

    // 项目使用的vite插件。量大，单独提取管理
    plugins: createVitePlugins(viteEnv, isBuild),

    // optimizeDeps: {
    //   // @iconify/iconify：依赖由@purge-iconsgenerated动态虚拟加载，所以需要明确指定
    //   include: [
    //     '@iconify/iconify',
    //     'ant-design-vue/es/locale/zh_CN',
    //     'moment/dist/locale/zh-cn',
    //     'ant-design-vue/es/locale/en_US',
    //     'moment/dist/locale/eu',
    //   ],
    //   exclude: ['vue-demi'],
    // },
  };
};
